// 链接：https://ac.nowcoder.com/acm/problem/22227
// 来源：牛客网
//
// 题目描述
// n个人（0,1,2,3,4...n-1），围成一圈，从编号为k的人开始报数，报数报到m的人出队（报数是1,2,...m这样报的）。下次从出队的人之后开始重新报数，循环往复，
// 当队伍中只剩最后一个人的时候，那个人就是大王。现在，给定n，k，m，
// 请你求出大王的编号。
// 输入描述:
// 输入一行包含三个整数n,k,m
//
// 1<=n<=100,1<=k<=n-1,1<=m<=100
// 输出描述:
// 输出一个整数
// 示例1
// 输入
// 复制
// 5 1 2
// 输出
// 复制
// 3
// #include <stdio.h>
//
// int josephus(int n, int k, int m) {
//     int result = k;  // 初始化时，大王的位置是k
//     for (int i = 2; i <= n; i++) {
//         result = (result + m) % i;
//     }
//     return result;  // 返回最后剩下的人的编号
// }
//
// int main() {
//     int n, k, m;
//     scanf("%d %d %d", &n, &k, &m);  // 输入n, k, m
//     // 由于题目是从1开始编号，算法是从0开始编号
//     // 所以需要将k减1来适应
//     printf("%d\n", josephus(n, k-1, m) + 1);  // 输出最后大王的位置，转换回1开始编号
//     return 0;
// }
//_____________________第二种方法__________________________________________
// #include <stdio.h>
// #include <stdlib.h>
//
// int josephus_simulation(int n, int k, int m) {
//     int *people = (int *)malloc(n * sizeof(int)); // 动态分配空间
//     for (int i = 0; i < n; i++) {
//         people[i] = 1; // 初始化所有人都在圈内
//     }
//
//     int count = 0, index = k - 1, remaining = n; // index从k-1开始，count用于计数
//
//     while (remaining > 1) {
//         if (people[index] == 1) { // 如果此人还在圈内
//             count++; // 报数
//             if (count == m) { // 报数到m时，出圈
//                 people[index] = 0; // 将该人标记为出圈
//                 remaining--; // 剩余人数减少
//                 count = 0; // 重置计数器
//             }
//         }
//         index = (index + 1) % n; // 顺时针移动到下一个人
//     }
//
//     // 找到剩下的最后一个人
//     for (int i = 0; i < n; i++) {
//         if (people[i] == 1) {
//             free(people); // 释放动态内存
//             return i + 1; // 编号从1开始
//         }
//     }
//
//     free(people); // 释放动态内存
//     return -1; // 理论上不会到这一步
// }
//
// int main() {
//     int n, k, m;
//     while (scanf("%d %d %d", &n, &k, &m) != EOF) {
//         printf("%d\n", josephus_simulation(n, k, m)); // 从第k个人开始报数
//     }
//     return 0;
// }
//__________________第三种___________________________________
// #include <stdio.h>
//
// int main() {
//     int n, k, m;
//
//     // 输入n、k、m
//     scanf("%d %d %d", &n, &k, &m);
//
//     // 初始化队列，存储每个人的编号
//     int people[n];
//     for (int i = 0; i < n; i++) {
//         people[i] = i;  // 队伍中的人是0到n-1
//     }
//
//     // 起始位置是k-1（因为输入的k是1-based，数组是0-based）
//     int current_pos = k - 1;
//
//     int remaining = n;  // 还剩下的人数
//
//     // 循环直到队伍中只剩一个人
//     while (remaining > 1) {
//         // 计算出队的位置，(current_pos + m - 1) % remaining
//         current_pos = (current_pos + m - 1) % remaining;
//
//         // 移除该位置的人，通过向左移动所有后续元素
//         for (int i = current_pos; i < remaining - 1; i++) {
//             people[i] = people[i + 1];
//         }
//
//         remaining--;  // 队伍中的人数减少
//     }
//
//     // 输出最后剩下的人的编号
//     printf("%d\n", people[0] + 1);  // 转换为1-based编号
//     return 0;
// }
